Java 如何处理嵌入式复合密钥?

Java 如何处理嵌入式复合密钥?,java,hibernate,composite-primary-key,Java,Hibernate,Composite Primary Key,我有一个名为watchlist的表,它只包含两个字段:symbol和name。这种组合是独一无二的。我遇到了休眠错误: “实体映射中的重复列” 错误,我不知道为什么 我创建了一个WatchlistId类,如下所示: @Embeddable public class WatchlistId implements Serializable { @Column(name="symbol") private String symbol; @Colum

我有一个名为watchlist的表,它只包含两个字段:symbol和name。这种组合是独一无二的。我遇到了休眠错误:

“实体映射中的重复列”

错误,我不知道为什么

我创建了一个WatchlistId类,如下所示:

@Embeddable
public class WatchlistId implements Serializable {
    @Column(name="symbol")
    private String symbol;
    
    @Column(name="name")
    private String name;
    
    WatchlistId() {     
    }

    WatchlistId(String symbol, String name) {
        this.symbol = symbol;
        this.name = name;
    }
//getters and setters
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
 
        if (o == null || getClass() != o.getClass()) return false;
 
        WatchlistId that = (WatchlistId) o;
        return Objects.equals(symbol, that.symbol) && Objects.equals(name, that.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(symbol, name);
    }   
@Entity
@Table(name = "watchlist")
public class Watchlist {
    @EmbeddedId
    public WatchlistId watchlistId;
    
    private String symbol;
    private String name;
 
    public Watchlist() {      
    }
    
    public Watchlist(WatchlistId watchlistId, String symbol, String name) {
        this.watchlistId = watchlistId;
        this.symbol = symbol;
        this.name = name;
    }
    
    public WatchlistId getWatchlistId() {
        return watchlistId;
    }
    public void setWatchlistId(WatchlistId watchlistId) {
        this.watchlistId = watchlistId;
    }
}
@Repository
public interface WatchlistRepository extends JpaRepository<Watchlist, WatchlistId>{
    @Query(value="select * from watchlist w where (name = :w.watchlistId.name)", nativeQuery = true)
    List<Watchlist> getWatchlist(@Param("name") String name);

    @Query(value="insert into watchlist w (symbol,name) values (:watchlist.watchlistId.symbol,:watchlist.watchlistId.name)", nativeQuery = true)
    String addSymbolToWatchlist(@Param("watchlist") Watchlist watchlist);
}
监视列表类如下所示:

@Embeddable
public class WatchlistId implements Serializable {
    @Column(name="symbol")
    private String symbol;
    
    @Column(name="name")
    private String name;
    
    WatchlistId() {     
    }

    WatchlistId(String symbol, String name) {
        this.symbol = symbol;
        this.name = name;
    }
//getters and setters
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
 
        if (o == null || getClass() != o.getClass()) return false;
 
        WatchlistId that = (WatchlistId) o;
        return Objects.equals(symbol, that.symbol) && Objects.equals(name, that.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(symbol, name);
    }   
@Entity
@Table(name = "watchlist")
public class Watchlist {
    @EmbeddedId
    public WatchlistId watchlistId;
    
    private String symbol;
    private String name;
 
    public Watchlist() {      
    }
    
    public Watchlist(WatchlistId watchlistId, String symbol, String name) {
        this.watchlistId = watchlistId;
        this.symbol = symbol;
        this.name = name;
    }
    
    public WatchlistId getWatchlistId() {
        return watchlistId;
    }
    public void setWatchlistId(WatchlistId watchlistId) {
        this.watchlistId = watchlistId;
    }
}
@Repository
public interface WatchlistRepository extends JpaRepository<Watchlist, WatchlistId>{
    @Query(value="select * from watchlist w where (name = :w.watchlistId.name)", nativeQuery = true)
    List<Watchlist> getWatchlist(@Param("name") String name);

    @Query(value="insert into watchlist w (symbol,name) values (:watchlist.watchlistId.symbol,:watchlist.watchlistId.name)", nativeQuery = true)
    String addSymbolToWatchlist(@Param("watchlist") Watchlist watchlist);
}
存储库如下所示:

@Embeddable
public class WatchlistId implements Serializable {
    @Column(name="symbol")
    private String symbol;
    
    @Column(name="name")
    private String name;
    
    WatchlistId() {     
    }

    WatchlistId(String symbol, String name) {
        this.symbol = symbol;
        this.name = name;
    }
//getters and setters
@Override
    public boolean equals(Object o) {
        if (this == o) return true;
 
        if (o == null || getClass() != o.getClass()) return false;
 
        WatchlistId that = (WatchlistId) o;
        return Objects.equals(symbol, that.symbol) && Objects.equals(name, that.name);
    }
 
    @Override
    public int hashCode() {
        return Objects.hash(symbol, name);
    }   
@Entity
@Table(name = "watchlist")
public class Watchlist {
    @EmbeddedId
    public WatchlistId watchlistId;
    
    private String symbol;
    private String name;
 
    public Watchlist() {      
    }
    
    public Watchlist(WatchlistId watchlistId, String symbol, String name) {
        this.watchlistId = watchlistId;
        this.symbol = symbol;
        this.name = name;
    }
    
    public WatchlistId getWatchlistId() {
        return watchlistId;
    }
    public void setWatchlistId(WatchlistId watchlistId) {
        this.watchlistId = watchlistId;
    }
}
@Repository
public interface WatchlistRepository extends JpaRepository<Watchlist, WatchlistId>{
    @Query(value="select * from watchlist w where (name = :w.watchlistId.name)", nativeQuery = true)
    List<Watchlist> getWatchlist(@Param("name") String name);

    @Query(value="insert into watchlist w (symbol,name) values (:watchlist.watchlistId.symbol,:watchlist.watchlistId.name)", nativeQuery = true)
    String addSymbolToWatchlist(@Param("watchlist") Watchlist watchlist);
}
@存储库
公共接口WatchlistRepository扩展了JpaRepository{
@查询(value=“select*from watchlist w where(name=:w.watchlistId.name)”,nativeQuery=true)
List getWatchlist(@Param(“name”)字符串名);
@查询(value=“插入到watchlist w(symbol,name)值(:watchlist.watchlistId.symbol,:watchlist.watchlistId.name)”,nativeQuery=true)
字符串addSymbolToWatchlist(@Param(“watchlist”)watchlist watchlist);
}

使用
@embeddeble
时,Embeddeble类中的字段会自动添加到表中,因此您会得到重复的字段

因此,您需要删除
symbol
name
字段,并从
WatchlistId
成员中使用它们:

@Entity
@Table(name = "watchlist")
public class Watchlist {
    @EmbeddedId
    public WatchlistId watchlistId;
    
    public String getSymbol(){
        return watchlistId.getSymbol();
    }
    
    public String getName(){
        return watchlistId.getName();
    }
}
        

使用
@embeddeble
时,Embeddeble类中的字段会自动添加到表中,因此您会得到重复的字段

因此,您需要删除
symbol
name
字段,并从
WatchlistId
成员中使用它们:

@Entity
@Table(name = "watchlist")
public class Watchlist {
    @EmbeddedId
    public WatchlistId watchlistId;
    
    public String getSymbol(){
        return watchlistId.getSymbol();
    }
    
    public String getName(){
        return watchlistId.getName();
    }
}
        

谢谢cdalxndr。这似乎修复了我描述的错误。现在出现了一个新的错误:使用方法public abstract java.util.List net.teknow.moneymachine.repository.WatchlistRepository.getWatchlist(java.lang.String)的命名参数,但在带注释的查询“从watchlist中选择*w where(name=:w.watchlistId.name)”中找不到参数“Optional[name]”@user3217883您使用了
@Param(“name”)
,因此sql参数名称必须相同(
name
)。将
:w.watchlistId.name
替换为
:name
。确实是。我真傻。非常感谢!多亏了像你这样善良的人,我逐渐得到了这些复杂的东西。谢谢你cdalxndr。这似乎修复了我描述的错误。现在出现了一个新的错误:使用方法public abstract java.util.List net.teknow.moneymachine.repository.WatchlistRepository.getWatchlist(java.lang.String)的命名参数,但在带注释的查询“从watchlist中选择*w where(name=:w.watchlistId.name)”中找不到参数“Optional[name]”@user3217883您使用了
@Param(“name”)
,因此sql参数名称必须相同(
name
)。将
:w.watchlistId.name
替换为
:name
。确实是。我真傻。非常感谢!多亏了像你这样善良的人,我才逐渐了解到这些复杂的东西。