首页 文章

JPA Field没有默认值,一对一关系

提问于
浏览
0

我在ECLIPSELINK中与我的一对一关系有问题,关系是用户和代理之间的关系,错误是

异常[EclipseLink-4002](Eclipse Persistence Services - 2.5.0.v20130507-3faac2b):org.eclipse.persistence.exceptions.DatabaseException内部异常:java.sql.SQLException:字段'userId'没有默认值错误代码:1364调用:INSERT INTO AGENT(ADDRESS,NOM,PRENOM)VALUES(?,?,?)bind => [3个参数绑定]

class diagram

database implementation

这是我的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);

2 回答

  • 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

    通过将"id"字段设置为“ IDENTITY ”策略,在数据存储区中,此列必须类似于 AUTO_INCREMENT (MySQL)或 SERIALIDENTITY . 这就是 IDENTITY 策略作为先决条件(如果您让JPA提供程序生成模式,则默认情况下) .

    如果不是,则将列类型更改为此类,或将策略更改为在运行时(而不是在数据存储区中)生成值的策略 .

相关问题