春天JPA @JoinColumn(唯一= TRUE)不工作

问题描述:

我的实体如下春天JPA @JoinColumn(唯一= TRUE)不工作

@Entity 
@Table(
    name = "t1", 
    uniqueConstraints = { 
      @UniqueConstraint(name = "u1", columnNames = {"u1"}), 
      @UniqueConstraint(name = "u2", columnNames = {"u2_id"}) //This does not enforce uniqueness 
    } 
) 
public class t1 
{ 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false) 
    private String u1; //Uniqueness is enforced here 

    @OneToOne 
    @JoinColumn(unique = true) //This does not enforce uniqueness 
    private U2 u2; 

} 

@Entity 
@Table(
    name = "u2", 
    uniqueConstraints = { 
      @UniqueConstraint(name = "p1", columnNames = {"p1"}) 
    } 
) 
public class u2 
{ 

    @Id 
    @GeneratedValue 
    private Long id; 

    @Column(nullable = false) 
    private String p1; //Uniqueness is enforced here 

} 

创建和

t1 t1_0 = new t1("t1_0"); 
t1 t1_1 = new t1("t1_1"); 
u2 u2_0 = new u2("u2_0"); 

repository.save(t1_0); 
repository.save(t1_1); 
repository.save(u2_0); 

t1_0 = repository.findOne(t1_0.getId()); 
t1_1 = repository.findOne(t1_1.getId()); 

t1_0.setu2(u2_0); 
t1_1.setu2(u2_0); 

更新实体交易完成后再t1_0.u2被绑定到u2_0和t1_1.u2绑定到u2_0。我预计它会抛出唯一性约束违例异常。

不明白什么是错的。 SO上的其他线程表明@JoinColumn(unique = true)应该这样做。

编辑 这是包裹在一个交易

t1_0 = repository.findOne(t1_0.getId()); 
t1_1 = repository.findOne(t1_1.getId()); 

t1_0.setu2(u2_0); 
t1_1.setu2(u2_0); 

EDIT2

出于某种原因,我也不能访问数据库。显示控制台视图,但添加密码后显示用户空白页(某些网络查询失败)。

但我可以从日志中创建外键和唯一约束看到藏汉

Hibernate: alter table driver add constraint UK_ssh305wwvomjtn6opolug33nj unique (cardo_id) 

Hibernate: alter table car add constraint FKosnia01vhqwmm888uxrg4o6f6 foreign key (manufacturerdo_id) references manufacturer 

Hibernate: alter table driver add constraint FK3yb5ci9sr6ieo6n4wwwef3puv foreign key (cardo_id) references car 

当添加

+1

您是如何生成数据库表的? –

+0

在这些行后面t1_0.setu2(u2_0); t1_1.setu2(u2_0);你更新了保存在数据库中的吗? (t1_0和t1_1)?这些行之后的代码是什么? –

+0

线daos得到自动提交后?我没有明确地调用save,因为在事务关闭后数据会从dao持久保存到表中,所以会发生一些春季魔术。 – Noripsni

列名(如果不止一个)应该用逗号介绍。 您的惯例是不对的

免责声明:未签上真正的数据库

@Table(
    name = "t1", 
    uniqueConstraints = { 
      @UniqueConstraint(name = "u1", columnNames = {"u1"}), 
      @UniqueConstraint(name = "u2", columnNames = {"u2", "id"}) // comma  
         } 

) 

我的交易是无效的。由于他们没有看到彼此的数据,我错误地创建了另一个数据。