java - 带有多个下划线的 Hibernate ManyToOne 映射不起作用

标签 java hibernate jpa

我正在尝试在 Hibernate 中创建具有 ManyToOne 关系的实体的映射。我正在尝试这个:

CampaignItemSlot 类:

 package models;

 import java.sql.Timestamp;

 import javax.persistence.Column;
 import javax.persistence.Entity;
 import javax.persistence.GeneratedValue;
 import javax.persistence.GenerationType;
 import javax.persistence.Id;
 import javax.persistence.JoinColumn;
 import javax.persistence.JoinTable;
 import javax.persistence.ManyToOne;
 import javax.persistence.Table;

@Entity
@Table(name = "campaign_item_slots")
public class CampaignItemSlot {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

@JoinColumn(name = "advert_slot_id")
@ManyToOne
private AdvertSlot advertSlot;

private boolean active;

private Timestamp date_created;

 private Timestamp date_updated;

 public CampaignItemSlot() {
    super();
    // TODO Auto-generated constructor stub
 }
}

但是我在日志文件中得到了这个:

  Caused by: org.hibernate.HibernateException: Missing column: advertSlot_id in text_advertising.campaign_item_slots

这是我的表 SQL:

  CREATE TABLE IF NOT EXISTS `text_advertising`.`campaign_item_slots` (
  `id` BIGINT NOT NULL AUTO_INCREMENT,   
  `campaign_item_id` BIGINT NOT NULL,
  `advert_slot_id` BIGINT NOT NULL,
  `active` TINYINT(1) NOT NULL DEFAULT TRUE,
  `date_created` DATETIME NOT NULL,
  `date_updated` DATETIME NOT NULL,
  PRIMARY KEY (`id`),
  INDEX `fk_campaignitems_1_idx` (`campaign_item_id` ASC),
  INDEX `fk_campaignitems_2_idx` (`advert_slot_id` ASC),
  CONSTRAINT `fk_campaign_item_slots_1`
  FOREIGN KEY (`campaign_item_id`)
  REFERENCES `text_advertising`.`campaignitems` (`id`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION,
  CONSTRAINT `fk_campaign_item_slots_2`
  FOREIGN KEY (`advert_slot_id`)
  REFERENCES `text_advertising`.`advert_slots` (`id`)
  ON DELETE NO ACTION
  ON UPDATE NO ACTION)
  ENGINE = InnoDB
  DEFAULT CHARACTER SET = utf8
  COLLATE = utf8_general_ci;

AdvertSlot 类:

  package models;

  import java.sql.Timestamp;

  import javax.persistence.Entity;
  import javax.persistence.EnumType;
  import javax.persistence.Enumerated;
  import javax.persistence.GeneratedValue;
  import javax.persistence.GenerationType;
  import javax.persistence.Id;
  import javax.persistence.ManyToOne;
  import javax.persistence.OneToMany;
  import javax.persistence.Table;

  @Entity
  @Table(name = "advert_slots")
  public class AdvertSlot {

@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
private long id;

@ManyToOne
private Publication publication;

private String name;

private String description;

private boolean active;

private Timestamp date_created;

private Timestamp date_updated;

public AdvertSlot() {
    super();
    // TODO Auto-generated constructor stub
}

public long getId() {
    return id;
}

public void setId(long id) {
    this.id = id;
}

public Publication getPublication() {
    return publication;
}

public void setPublication(Publication publication) {
    this.publication = publication;
}

public String getName() {
    return name;
}

public void setName(String name) {
    this.name = name;
}

public String getDescription() {
    return description;
}

public void setDescription(String description) {
    this.description = description;
}

public boolean isActive() {
    return active;
}

public void setActive(boolean active) {
    this.active = active;
}

public Timestamp getDate_created() {
    return date_created;
}

public void setDate_created(Timestamp date_created) {
    this.date_created = date_created;
}

public Timestamp getDate_updated() {
    return date_updated;
}

public void setDate_updated(Timestamp date_updated) {
    this.date_updated = date_updated;
}   
 }

不知何故,Hibernate 没有看到我的 advert_slot_id,请帮忙?

最佳答案

这里的答案是通过扩展 org.hibernate.cfg.DefaultNamingStrategy 创建自定义命名策略,然后通过 hibernate 配置引用它:hibernate.ejb.naming_strategy

这是一个例子:

    @Override
    public  String foreignKeyColumnName(String propertyName, String propertyEntityName, String propertyTableName, String referencedColumnName) {
    	String changed = CaseFormat.UPPER_CAMEL.to(CaseFormat.LOWER_UNDERSCORE, propertyName) + "_id";
    	return changed;
    }

关于java - 带有多个下划线的 Hibernate ManyToOne 映射不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29848340/

相关文章:

java - 适用于 Java 的 Microsoft Dynamics Nav Connector

java - 以下 Hibernate 自定义 ID 生成器代码是否正确?

java - 我可以为数据库表主键设置一个 MAX 值吗?

hibernate - javax.validation.ConstraintViolationException : Bean Validation constraint(s) violated while executing Automatic Bean Validation on event :'prePersist'

java - 如何在表单绑定(bind)期间使用 Spring 的 IdToEntityConverter 进行实体类型转换?

java 泛型运行时 error.java.util.ConcurrentModificationException

java - 为什么我的 OSGI 示例不会在 bundle 启动时打印 "Hello World"?

java - 有没有办法在 Java 中使用两个锁对象进行同步?

java - 使用 Hibernate Criteria API 查询与投影的多对一关系

java - 如何使用 Hibernate 将枚举映射到单独的表?