2016-07-22 2 views
1

私は以下の2つのドメインモデルを持っています。Spring Data JPA - コンポジットキーで子エンティティを挿入するにはどうすればよいですか?

user 
---- 
userid (PK) 
type 

like 
------ 
likeid (PK) 
userid (PK) 
word 

like.useridは、Userのuseridを参照し、複合主キーの一部です。

とJUnitテストを実行すると、私はエラーを持っているテストコード

@RunWith(SpringJUnit4ClassRunner.class) 
@SpringApplicationConfiguration(classes = SpringJpaTestApplication.class) 
@WebAppConfiguration 
@IntegrationTest("server.port:0") 
public class Test { 

    @Autowired 
    private UserRepository userRepository; 

    @org.junit.Test 
    public void application() throws Exception { 
     User user = new User(); 
     user.setType(USER_TYPE.USER); 

     Like like = new Like(); 
     LikeKey likeKey = new LikeKey(); 
     likeKey.setLikeNo(1L); 

     like.setLikeKey(likeKey); 
     like.setWord("word"); 
     like.setUser(user); 

     user.getLikes().add(like); 

     userRepository.save(user); 
    } 
} 

を挿入します。

Hibernate: insert into user (uno, user_type) values (null, ?) 
Hibernate: insert into like (word, like_no, uno) values (?, ?, ?) 
2016-07-22 13:44:36.499 WARN SqlExceptionHelper : SQL Error: 42001, SQLState: 42001 
2016-07-22 13:44:36.499 ERROR SqlExceptionHelper : Syntax error in SQL statement "INSERT INTO LIKE[*] (WORD, LIKE_NO, UNO) VALUES (?, ?, ?) "; expected "identifier"; SQL statement: [42001-190] 

まずは可能ですか?

第2に、可能であれば、私のコードで何が間違っていますか?

User.java

@Entity 
@Table(name = "user") 
@Data 
public class User { 

    @Id 
    @GeneratedValue 
    @Column(name = "uno") 
    private Long userNo; 

    @Column(name = "user_type") 
    @Enumerated(EnumType.STRING) 
    private USER_TYPE type; 

    @OneToMany(mappedBy = "user", cascade = CascadeType.ALL) 
    private List<Like> likes = new ArrayList<>(); 

    public enum USER_TYPE {USER, ADMIN} 

    @Override 
    public String toString() { 
     return "User [userNo=" + userNo + ", type=" + type + ", likes=" + likes + "]"; 
    } 

} 

そしてLike.java

@Entity 
@Table(name = "like") 
@Data 
public class Like { 

    @EmbeddedId 
    private LikeKey likeKey; 

    @Column(name = "word") 
    private String word; 

    @MapsId(value = "userNo") 
    @ManyToOne(optional = false, targetEntity = User.class) 
    @JoinColumn(name = "uno") 
    private User user; 

    @Embeddable 
    @Data 
    @NoArgsConstructor 
    @AllArgsConstructor 
    public static class LikeKey implements Serializable { 

     private static final long serialVersionUID = 2116470670954200809L; 

     @Column(name = "likeNo") 
     private Long likeNo; 

     @Column(name = "uno") 
     private Long userNo; 

    } 
} 

https://gist.github.com/okihouse/78dacfeb37f4753628433beb1b591f99

答えて

0

私のようなSQLキーワード

使用このコードがあるため、問題がLIKEエンティティであると思います:

@Entity 
@Table(name = "like_table") 
@Data 
public class Like { 
... 
} 
+0

ありがとう。それは解決されました。 – OKIHOUSE

+0

あなたはウェルカムです:) –

関連する問題