JPA вопрос (использование Scala) - PullRequest
2 голосов
/ 14 июля 2011

Вопрос OpenJPA и Scala.

В базе данных есть 2 таблицы (h2) - задачи и списки задач.

TaskList содержит коллекцию ArrayList.
Каждый TaskList может содержать задачи из другого TaskLists
Когда taskX изменен в TaskList1, его необходимо изменить в TaskList2, если он содержит taskX.

Как это реализовать?

Я могу добавить новую задачу в список задач и сохранить ее в БД, но когда я пытаюсь добавить taskX из коллекции задач TaskList1 в коллекцию задач TaskList2 и сохранить ее, taskX не сохраняется в БД.

Пример:
1. Добавление task1 в taskList1 и task2 в taskList2 приведет к:
TaskList1: [task1]
TaskList2: [task2]
2. Добавление task2 в taskList1 приведет к:
TaskList1: [task1]
3. Добавление task3 в taskList1 и task4 в taskList2 приведет к:
TaskList1: [task1, task3]
TaskList2: [task2, task4]

Что не так?

Класс задачи:

import _root_.javax.persistence._
import org.apache.openjpa.persistence._
@Entity
@Table(name="tasks")
@ManyToMany
class CTask (name: String) {
   def this() = this("new task")
   @Id
   @GeneratedValue(strategy=GenerationType.IDENTITY)
   @Column(unique = true, nullable = false)
   var id: Int = _
   var title: String = name
   def getId = id
   def getTitle = title
   def setTitle(titleToBeSet: String) = title = titleToBeSet
   override def toString: String = title
}

Класс TaskList:

import _root_.javax.persistence._
import _root_.java.util.ArrayList
import org.apache.openjpa.persistence._
@Entity
@Table(name="tasklists")
class CTaskList(titleText: String) {
@Id
@GeneratedValue(strategy=GenerationType.IDENTITY)
@Column(unique = true, nullable = false)
    var id: Int = _
    @Column(nullable = false)
    var title: String = titleText
    @ManyToMany
var tasks: ArrayList[CTask] = _;
var tags: String = ""
var rank: Int = 0

def getTasks = tasks
def this() = this("new task list")
def createTasks: ArrayList[CTask] = {
    tasks = new ArrayList[CTask]
    tasks
}
def getID = id
def getTags = tags
def setTags(tagsParam: String) = tags = tagsParam
def getRank = rank
def setRank(rankParam: Int) = rank = rankParam
def getTitle: String = title
def getTaskById(index: Int): CTask = {
    null
}
def equals(anotherTaskList: CTaskList): Boolean = {
    if (anotherTaskList == null)  return false
    if (anotherTaskList.getTasks == null)
        return id == anotherTaskList.getID && title == anotherTaskList.getTitle && tags == anotherTaskList.getTags && rank == anotherTaskList.getRank && tasks == null;
    else
        return id == anotherTaskList.getID && title == anotherTaskList.getTitle && tags == anotherTaskList.getTags && rank == anotherTaskList.getRank && tasks != null && tasks.size == anotherTaskList.getTasks.size
}

def addTask(taskToBeAdded: CTask): Int = {
    if (tasks == null) 
        tasks = new ArrayList[CTask]
    tasks.add(taskToBeAdded)
    tasks.indexOf(taskToBeAdded)}
def printTasks = println("TaskList's " + this + " tasks: " + tasks)

}

1 Ответ

1 голос
/ 14 июля 2011

Насколько я знаю, связь «многие ко многим» (как указано в ваших аннотациях сопоставления) подразумевает таблицу ассоциации между двумя сущностями (т. Е. Должна быть указана аннотация @JoinTable).

...