我虽然我想要的很简单,但我找不到任何解决我的问题的方法。我正在使用 playframework 1.2.3,它使用 Hibernate 作为 JPA。所以我认为playframework与问题无关。
我有一些课程(我省略了不相关的字段)
public class User {
...
}
public class Task {
public DataContainer dataContainer;
}
public class DataContainer {
public Session session;
public User user;
}
public class Session {
...
}
所以我有从 Task 到 DataContainer 以及从 DataContainer 到 Session 的关联,并且 DataContainer 属于一个用户。DataContainers 可以始终具有相同的用户,但每个实例的会话必须不同。并且任务的 DataContainer 在每个实例中也必须不同。DataContainer 可以有或没有会话(它是可选的)。我只使用单向关联。应该足够了。
换句话说:每个任务必须有一个 DataContainer。每个 DataContainer 必须有一个/相同的 User 并且可以有一个 Session。
要创建数据库模式,我使用 JPA 注释:
@Entity
public class User extends Model {
...
}
@Entity
public class Task extends Model {
@OneToOne(optional = false, cascade = CascadeType.ALL)
public DataContainer dataContainer;
}
@Entity
public class DataContainer extends Model {
@OneToOne(optional = true, cascade = CascadeType.ALL)
public Session session;
@ManyToOne(optional = false, cascade = CascadeType.ALL)
public User user;
}
@Entity
public class Session extends Model {
...
}
顺便说一句:模型是一个播放类,并提供主要 id 作为 long 类型。
当我为每个实体创建一些对象并“连接它们”时,我的意思是关联,它工作正常。但是当我尝试删除一个 Session 时,我得到了一个违反约束的异常,因为 DataContainer 仍然引用我要删除的 Session。
我希望 DataContainer 的 Session(字段)将分别设置为 null 外键(session_id)应该在数据库中取消设置。这没关系,因为它是可选的。
我不知道,我想我有很多问题。我使用了正确的注释@OneToOne
吗?
我在互联网上发现了一些额外的注释和属性:
@JoinColumn
以及mappedBy
反向关系的属性。但我没有,因为它不是双向的。或者是双向关联。本质上?
另一种尝试是使用在更新或删除时@OnDelete(action = OnDeleteAction.CASCADE)
从 s 更改为的约束:NO ACTION
ADD CONSTRAINT fk4745c17e6a46a56 FOREIGN KEY (session_id)
REFERENCES annotation_session (id) MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE CASCADE;
但在这种情况下,当我删除会话时,DataContainer 和 User 将被删除。这对我来说是错误的。
编辑: 我正在使用 postgresql 9,jdbc 的东西包含在 play 中,我唯一的 db 配置是
db=postgres://app:app@localhost:5432/app