我在ECLIPSELINK中与我的一对一关系有问题,关系是用户和代理之间的关系,错误是
异常[EclipseLink-4002](Eclipse持久性服务 - 2.5.0.v20130507-3faac2b):org.eclipse.persistence.exceptions.DatabaseException内部 例外:java.sql.SQLException:字段' userId'没有 默认值错误代码:1364呼叫:INSERT INTO AGENT(ADDRESS,NOM, PRENOM)VALUES(?,?,?)bind => [3个参数绑定]
这是我的JPA代码
@Entity
@NamedQuery(name="User.findAll", query="SELECT u FROM User u")
public class User implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private int active;
private String email;
private String password;
//bi-directional one-to-one association to Agent
@OneToOne(mappedBy="user",cascade=CascadeType.PERSIST)
private Agent agent;
//....
@Entity
@NamedQuery(name="Agent.findAll", query="SELECT a FROM Agent a")
public class Agent implements Serializable {
private static final long serialVersionUID = 1L;
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
private String address;
private String nom;
private String prenom;
//bi-directional one-to-one association to User
@OneToOne(cascade=CascadeType.PERSIST)
@PrimaryKeyJoinColumn(name="userId")
private User user;
//...
}
//the code that contains the error
Agent agent = new Agent();
agent.setAddress("addresse 1");
agent.setNom("nom1");
agent.setPrenom("prenom 1");
User user = new User();
user.setActive(1);
user.setEmail("test@mail.local");
user.setPassword("p@ssword");
agent.setUser(user);
agentService.add(agent);
答案 0 :(得分:1)
当我使用PrimaryKeyJoinColumn
时,我已经知道EclipseLink存在这种问题。
在Agent
实体中,您将id
定义为PK:
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private int id;
但您还定义了另一个带有PK的字段(userId
,它也是User表上的外键):
//bi-directional one-to-one association to User
@OneToOne(cascade=CascadeType.PERSIST)
@PrimaryKeyJoinColumn(name="userId")
private User user;
当我看到你的数据库图时,我不确定那是你的目标。
如果我看不对,你真的想这样做,你可以尝试使用Embeddable
对象作为PK的必填字段。
如果你总是例外,您可以通过先保留用户,然后将其设置为代理并持久保存代理来绕过问题。
如果您不需要在Agent
中使用此复合密钥,请将@PrimaryKeyJoinColumn
替换为@JoinColumn
:
而不是:
//bi-directional one-to-one association to User
@OneToOne(cascade=CascadeType.PERSIST)
@PrimaryKeyJoinColumn(name="userId")
private User user;
那样做:
//bi-directional one-to-one association to User
@OneToOne(cascade=CascadeType.PERSIST)
@JoinColumn(name="userId")
private User user;
答案 1 :(得分:1)
通过将“id”字段设为“IDENTITY
”策略,在数据存储区中,此列必须类似于AUTO_INCREMENT
(MySQL)或SERIAL
或IDENTITY
。这就是IDENTITY
策略作为先决条件(如果您让JPA提供程序生成模式,则默认情况下会有)。
如果不是,那么 将列类型更改为这样,或将策略更改为在运行时生成值的内容(不在数据存储区)。