2016-07-22 11 views
1

Ich habe die folgenden zwei Domänenmodell.Spring Data JPA - Wie fügt man untergeordnete Elemente mit zusammengesetzten Schlüssel ein?

user 
---- 
userid (PK) 
type 

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

like.userid Referenzen userid in Benutzer- und Teil des zusammengesetzten Primärschlüssel ist.

Und legen Sie Testcode

@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); 
    } 
} 

Ich habe einen Fehler bei der JUnit-Test ausgeführt werden.

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] 

Erstens, ist es möglich?

Zweitens, wenn möglich, was ist falsch in meinem Code?

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 + "]"; 
    } 

} 

Und 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

Antwort

0

ich glaube, das Problem in LIKE Entity ist da wie ein Stichwort Sql ist

Verwendung dieser Code:

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

Vielen Dank. Es ist gelöst. – OKIHOUSE

+0

Sie sind willkommen :) –