Java 如何处理嵌入式复合密钥?
我有一个名为watchlist的表,它只包含两个字段:symbol和name。这种组合是独一无二的。我遇到了休眠错误: “实体映射中的重复列” 错误,我不知道为什么 我创建了一个WatchlistId类,如下所示: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
@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
。确实是。我真傻。非常感谢!多亏了像你这样善良的人,我才逐渐了解到这些复杂的东西。