春天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
当添加
答
列名(如果不止一个)应该用逗号介绍。 您的惯例是不对的
免责声明:未签上真正的数据库
@Table(
name = "t1",
uniqueConstraints = {
@UniqueConstraint(name = "u1", columnNames = {"u1"}),
@UniqueConstraint(name = "u2", columnNames = {"u2", "id"}) // comma
}
)
答
我的交易是无效的。由于他们没有看到彼此的数据,我错误地创建了另一个数据。
您是如何生成数据库表的? –
在这些行后面t1_0.setu2(u2_0); t1_1.setu2(u2_0);你更新了保存在数据库中的吗? (t1_0和t1_1)?这些行之后的代码是什么? –
线daos得到自动提交后?我没有明确地调用save,因为在事务关闭后数据会从dao持久保存到表中,所以会发生一些春季魔术。 – Noripsni