2016-03-30 5 views
0

I持ってJava EEアプリケーションの次のモデルオブジェクト:JPA持たないEJBException IDがEntityManager.persist()にnullである

Person.java

@Entity 
@Table(name = "person") 
public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_person") 
    private Integer idPerson; 

    // some other fields (name, birthdate, etc.) 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "person") 
    private User user; 

    // Constructors, get/set, etc. 

User.java

@Entity 
@Table(name = "user") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Basic(optional = false) 
    @Column(name = "id_person") // Because it's a FK 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    private Integer idPerson; 

    // some other fields (username, etc) 

    @JoinColumn(name = "id_person", referencedColumnName = "id_persona", insertable = false, updatable = false) 
    @OneToOne(optional = false, cascade = CascadeType.PERSIST) 
    private Person person; 

    // Constructors, get/set, etc. 

ManagedBeanは、次のとおりです。

UserController.java

@ManagedBean(name = "usuarioController") 
@ViewScoped 
public class UsuarioController implements Serializable{ 
    private static final long serialVersionUID = 7002352152240769558L; 

    @EJB 
    private UserFacadeLocal userEJB; 
    private Person person; 
    private User user; 

    @PostConstruct 
    public void init() { 
     person = new Person(); 
     user = new User(); 
    } 

    // getters/setters 

    public void register(){ 
    try{ 
     this.user.setPerson(person); 
     this.person.setUser(user); // BreakPoint 1 
     userEJB.create(user); 
     // Success Message 
     } catch (Exception e){ // Breakpoint 2 
      // Error message 
     } 
    } 

UserPersonオブジェクトは、JSFページで<h:form>で満たされています。プログラムのデバッグ私はBreakpoint 1に、person.idPersonuser.idPersonの両方のフィールドがNULLであることが分かります。 Breakpoint 2person.idPersonには値がありますが、user.idPersonはまだNULLです。キャッチExceptionは(NetBeansでの変数の記述に従う)EJBExceptionであり、メッセージは次のとおり

Error Code: 1048 
Call: INSERT INTO user (id_person, ...) VALUES (?, ?, ?, ?, ?) 
    bind => [5 parameters bound] 
Query: InsertObjectQuery(model.User[ idPerson=null ]) 
...stacktrace... 
com.mysql.jdbc.exceptions.jdbc4.MySQLIntegrityConstraintViolationException: Column 'id_person' cannot be null 

問題がどこにあるか、私は見つけることができません。私はJDK 1.8、JSF 2.2、およびPersistence ProviderとしてのEclipseLink2.5.2とともにJavaEE 7を使用しています。

何か助けていただければ幸いです。事前に感謝

+0

ユーザーの –

+0

申し訳ありませんが、翻訳エラーです。あなたは 'usuario'(スペイン語のユーザ)を読む' user'でなければなりません。通常、私は変数の目的をよりよく「国際的に理解する」ために変数名を「翻訳」します。私は今それを変更します –

答えて

0

私はPersonUserテーブルの両方に同じPKを使用したいと思います。

以下のように、@MapsIdアノテーションを使用して、あなたのエンティティを更新します。

@Entity 
@Table(name = "person") 
public class Person implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @GeneratedValue(strategy = GenerationType.IDENTITY) 
    @Column(name = "id_person") 
    private Integer idPerson; 

    @OneToOne(cascade = CascadeType.ALL, mappedBy = "person") 
    User user; 

    @Override 
    public String toString() { 
     return "Person [idPerson=" + idPerson + ", user=" + user.person.idPerson + "]"; 
    } 
} 

@Entity 
@Table(name = "user") 
public class User implements Serializable { 
    private static final long serialVersionUID = 1L; 

    @Id 
    @Column(name = "id_person") 
    Integer idPerson; 

    @OneToOne 
    @JoinColumn(name = "id_person", referencedColumnName = "id_person", insertable = false, updatable = false) 
    @MapsId 
    Person person; 
} 

そして節約しながら、としてUserオブジェクトにPersonフィールドを設定します。テーブルの名前を持つエンティティがありません

Person person = new Person(); 
User user = new User(); 
person.user = user; 
user.person = person; 
userEJB.create(person); or userEJB.create(user); 
関連する問題