2015-04-30 7 views
2

Я использовал шаблон плех-пружинные данные JPA, чтобы начать проект иSpring Data JPA - Композитный первичного ключ вопрос

У меня возникли проблемы, пытаясь сделать карту спящего режима в соединении таблицы, использует составной первичный ключ.

База данных, к которой я подключаюсь, представляет собой существующий mysql.

Пожалуйста, смотрите ниже:

SQL:

CREATE TABLE IF NOT EXISTS `text_advertising`.`campaign_item_slots` (
 
    `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 (`campaign_item_id`, `advert_slot_id`), 
 
    INDEX `fk_campaign_item_slots_2_idx` (`advert_slot_id` ASC), 
 
    CONSTRAINT `fk_campaign_item_slots_1` 
 
    FOREIGN KEY (`campaign_item_id`) 
 
    REFERENCES `text_advertising`.`campaign_items` (`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;

CampaignItemSlot Класс:

@Entity 
 
@Table(name = "campaign_item_slots") 
 
public class CampaignItemSlot implements Serializable{ 
 
\t 
 
\t @EmbeddedId 
 
\t CampaignItemSlotId campaignItemSlotId; 
 
\t 
 
    private boolean active; 
 
    
 
    private Timestamp date_created; 
 

 
    private Timestamp date_updated; 
 

 
}

CampaignItemSlotId Класс

@Embeddable 
 
public class CampaignItemSlotId implements Serializable{ 
 

 
\t @Column(name="advert_slot_id") 
 
\t public long advertSlot; 
 
\t 
 
\t @Column(name="campaign_item_id") 
 
\t public long campaignItem; 
 
\t 
 
}

Когда я установил "hibernate.hbm2ddl.auto", "проверки", то я получаю следующее сообщение об ошибке:

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

W Я установил «hibernate.hbm2ddl.auto», «update», тогда поле id автоматически создается в таблице campaign_item_slots, как показано, когда я создаю таблицу создания show. Это не то, что я хочу:

| campaign_item_slots | CREATE TABLE `campaign_item_slots` (
 
    `campaign_item_id` bigint(20) NOT NULL, 
 
    `advert_slot_id` bigint(20) NOT NULL, 
 
    `active` tinyint(1) NOT NULL DEFAULT '1', 
 
    `date_created` datetime NOT NULL, 
 
    `date_updated` datetime NOT NULL, 
 
    `id` bigint(20) NOT NULL, 
 
    `advertSlot_id` bigint(20) DEFAULT NULL, 
 
    `campaignItem_id` bigint(20) DEFAULT NULL, 
 
    PRIMARY KEY (`campaign_item_id`,`advert_slot_id`), 
 
    KEY `fk_campaign_item_slots_2_idx` (`advert_slot_id`), 
 
    KEY `FK_q87o53119u79073jwttacsqta` (`advertSlot_id`), 
 
    KEY `FK_es60h5vj30rllkf0js1qy642y` (`campaignItem_id`), 
 
    CONSTRAINT `FK_es60h5vj30rllkf0js1qy642y` FOREIGN KEY (`campaignItem_id`) REFERENCES `campaign_items` (`id`), 
 
    CONSTRAINT `fk_campaign_item_slots_1` FOREIGN KEY (`campaign_item_id`) REFERENCES `campaign_items` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
 
    CONSTRAINT `fk_campaign_item_slots_2` FOREIGN KEY (`advert_slot_id`) REFERENCES `advert_slots` (`id`) ON DELETE NO ACTION ON UPDATE NO ACTION, 
 
    CONSTRAINT `FK_q87o53119u79073jwttacsqta` FOREIGN KEY (`advertSlot_id`) REFERENCES `advert_slots` (`id`) 
 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 |

Это мой build.sbt:

version := "1.0-SNAPSHOT" 
 

 
libraryDependencies ++= Seq(
 
    javaCore, 
 
    javaJpa, 
 
    javaWs % "test", 
 
    "org.springframework" % "spring-context" % "4.1.4.RELEASE", 
 
    "org.springframework.data" % "spring-data-jpa" % "1.8.0.RELEASE", 
 
    "org.springframework" % "spring-orm" % "4.1.4.RELEASE", 
 
    "org.springframework" % "spring-jdbc" % "4.1.4.RELEASE", 
 
    "org.springframework" % "spring-tx" % "4.1.4.RELEASE", 
 
    "org.springframework" % "spring-expression" % "4.1.4.RELEASE", 
 
    "org.springframework" % "spring-aop" % "4.1.4.RELEASE", 
 
    "org.springframework" % "spring-test" % "4.1.4.RELEASE" % "test", \t javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), 
 
    "org.hibernate" % "hibernate-entitymanager" % "4.3.8.Final", 
 
    "javax.inject" % "javax.inject" % "1", 
 
    "mysql" % "mysql-connector-java" % "5.1.34", 
 
    "org.json" % "json" % "20090211" 
 
) 
 

 
lazy val root = (project in file(".")).enablePlugins(PlayJava)

Я пробовал много различных комбинаций использования IdClass и EmbeddedId и т. д., как описано на этом сайте: mapping variations

Так какой комбинации вещей, которые я стараюсь, после некоторых пустячный я получаю ту же ошибку в:

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

Я начинаю задаваться вопросом, если это вопрос весной данных.

Приятно оценить любую помощь в этом. Благодарю.

+0

Нет проблем с тем, как вы комбинировали idClass и Embedded. Я могу заставить вас работать с вашим кодом. SInce вы уже определили схему, почему вы хотите использовать hibernate.hbm2ddl.auto. Почему бы просто не установить свойство вообще? – ArunM

+0

Спасибо ArunM за запуск кода. Конфигурация, которую я предоставил в своем сообщении, просто не хотела работать для меня вообще. См. Ответ на этот пост. – HashBang

ответ

0

Похоже конфиг ниже сделал это для меня:

CampaignItemSlot.Java

package models; 
 

 
import java.io.Serializable; 
 
import java.sql.Timestamp; 
 

 
import javax.persistence.EmbeddedId; 
 
import javax.persistence.Entity; 
 
import javax.persistence.GeneratedValue; 
 
import javax.persistence.GenerationType; 
 
import javax.persistence.Id; 
 
import javax.persistence.JoinColumn; 
 
import javax.persistence.JoinColumns; 
 
import javax.persistence.ManyToOne; 
 
import javax.persistence.MapsId; 
 
import javax.persistence.Table; 
 

 
@Entity 
 
@Table(name = "campaign_item_slots") 
 
public class CampaignItemSlot implements Serializable{ 
 
    
 
    @EmbeddedId 
 
    private CampaignItemSlotPk campaignItemSlotPk;  
 

 
    @MapsId("advert_slot_id") 
 
    @JoinColumns({ 
 
     @JoinColumn(name="advert_slot_id", referencedColumnName="id"), 
 
    }) 
 
    @ManyToOne AdvertSlot advertSlot; 
 
    
 
    @MapsId("campaign_item_id") 
 
    @JoinColumns({ 
 
     @JoinColumn(name="campaign_item_id", referencedColumnName="id"), 
 
    }) 
 
    @ManyToOne CampaignItem campaignItem;  
 
    
 
    private boolean active; 
 
    
 
    private Timestamp date_created; 
 

 
    private Timestamp date_updated; 
 

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

 
\t public CampaignItemSlotPk getCampaignItemSlotPk() { 
 
\t \t return campaignItemSlotPk; 
 
\t } 
 

 
\t public void setCampaignItemSlotPk(CampaignItemSlotPk campaignItemSlotPk) { 
 
\t \t this.campaignItemSlotPk = campaignItemSlotPk; 
 
\t } 
 

 
\t public boolean isActive() { 
 
\t \t return active; 
 
\t } 
 

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

 
\t public Timestamp getDate_created() { 
 
\t \t return date_created; 
 
\t } 
 

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

 
\t public Timestamp getDate_updated() { 
 
\t \t return date_updated; 
 
\t } 
 

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

 
\t public AdvertSlot getAdvertSlot() { 
 
\t \t return advertSlot; 
 
\t } 
 

 
\t public void setAdvertSlot(AdvertSlot advertSlot) { 
 
\t \t this.advertSlot = advertSlot; 
 
\t } 
 

 
\t public CampaignItem getCampaignItem() { 
 
\t \t return campaignItem; 
 
\t } 
 

 
\t public void setCampaignItem(CampaignItem campaignItem) { 
 
\t \t this.campaignItem = campaignItem; 
 
\t } 
 
\t 
 
}

CampaignItemSlotPK.java

package models; 
 

 
import java.io.Serializable; 
 
import java.sql.Timestamp; 
 

 
import javax.persistence.Column; 
 
import javax.persistence.Embeddable; 
 
import javax.persistence.Entity; 
 
import javax.persistence.JoinColumn; 
 
import javax.persistence.ManyToOne; 
 
import javax.persistence.Table; 
 

 
@Embeddable 
 
public class CampaignItemSlotPk implements Serializable{ 
 
    
 
    @Column(name="campaign_item_id") 
 
    private long campaignItem; 
 

 
    @Column(name="advert_slot_id") 
 
    private long advertSlot; 
 

 
\t public CampaignItemSlotPk() { 
 
\t \t // TODO Auto-generated constructor stub 
 
\t } 
 

 
\t public long getCampaignItem() { 
 
\t \t return campaignItem; 
 
\t } 
 

 
\t public void setCampaignItem(long campaignItem) { 
 
\t \t this.campaignItem = campaignItem; 
 
\t } 
 

 
\t public long getAdvertSlot() { 
 
\t \t return advertSlot; 
 
\t } 
 

 
\t public void setAdvertSlot(long advertSlot) { 
 
\t \t this.advertSlot = advertSlot; 
 
\t } 
 

 

 
}

build.sbt

javaJpa.exclude("org.hibernate.javax.persistence", "hibernate-jpa-2.0-api"), 
 
    "org.hibernate" % "hibernate-entitymanager" % "4.3.0.Final", 
 
    "mysql" % "mysql-connector-java" % "5.1.34",

Это исправлено.