ㆍReferential integrity constraint violation



오류 :

ERROR : HHH000315: Exception executing batch [org.h2.jdbc.JdbcBatchUpdateException: Referential integrity constraint violation: "FKOU1XVFC0SWVOFR46KFD8KHY1N: PUBLIC.AUTHCOMPOSITE FOREIGN KEY(USER_SEQ) REFERENCES PUBLIC.USER(USER_SEQ) (12)"; SQL statement:


이유 :

두 Entity간에 부모, 자식 관계가 맺어졌지만 각각 클래스의 ID값에 @GeneratedValue를 설정했기 때문에 각각의 시퀀스 값이 들어가게 된다. 여기서 FK제약조건이 걸려 오류가 난 것이다.


해결책 :

두 Entity 중에 FK를 가지는 Entity의 @GeneratedValue를 삭제한다.







save the transient instance before flushing



오류 :

org.hibernate.TransientObjectException: object references an unsaved transient instance - save the transient instance before flushing: 


이유 :

참조되는 객체가 save() 되지 않아서 발생되었다. 개체가 저장되지 않은 일시적인 인스턴스를 참조하기 때문이다.

@OneToMany 또는 @ManyToOne 을 사용할 때 부모 개체에 추가하는 자식(혹은 참조) 개체가 아직 데이터베이스에 저장되지 않아서 생긴 문제이다.


해결책 :

맵핑 어노테이션에 cascade=CascadeType.ALL 추가. cascade(종속성)를 주어서 부모 개체가 저장될 때 참조 개체들도 저장하게 한다.


@ManyToOne(cascade=CascadeType.ALL) 



참조:

CascadeType의 종류에는 다음과 같은 것들이 있다.


 ㆍCascadeType.PERSIST

엔티티를 영속화 할 때이 필드에 보유 된 엔티티도 유지합니다. EntityManager가 flush 중에 새로운 엔티티를 참조하는 필드를 찾고 이 필드가 CascadeType.PERSIST를 사용하지 않으면 오류이므로이 Cascade 규칙의 자유로운 적용을 제안합니다.


CascadeType.MERGE

엔티티 상태를 병합 할 때, 이 필드에 보유 된 엔티티도 병합하십시오.


CascadeType.REFRESH

엔티티를 새로 고칠 때, 이 필드에 보유 된 엔티티도 새로 고칩니다.


CascadeType.REMOVE

엔티티를 삭제할 때, 이 필드에 보유 된 엔티티도 삭제하십시오.


CascadeType.DETACH

부모 엔티티가 detach()를 수행하게 되면, 연관된 엔티티도 detach() 상태가 되어 변경사항이 반영되지 않는다.


CascadeType.ALL

모든 Cascade 적용






H2


H2는 자바로 작성된 관계형 데이터베이스 관리 시스템이다. 자바 애플리케이션에 임베드하거나 클라이언트-서버 모드에서 구동할 수 있다.(출처: 위키백과)




1. 의존성 추가


build.gradle에 'com.h2database:h2'를 추가해준다.



dependencies {

      ...

      runtimeOnly('com.h2database:h2')

}




2. DataSource 설정


properties나 yml 파일 등에 아래와 같이 선언한다.



# H2 Setting

spring.datasource.driverClassName=org.h2.Driver

spring.datasource.url=jdbc:h2:~/test;AUTO_SERVER=TRUE

spring.datasource.username=sa

spring.datasource.password=

spring.h2.console.enabled=true

spring.h2.console.path=/console



ㆍAUTO_SERVER=TRUE 설정은 여러 프로세스에서 동시에 접속이 가능하도록 해준다.

path는 접속할 context를 의미한다. ( ex.) localhost:8080/console )

ㆍenabled는 콘솔 사용여부를 의미한다.



3. H2에 접속


H2 접속에는 2가지 방법이 있다.


1) Spring Boot App으로 서버를 기동시켜 localhost:8080/console 로 접속




2) Windows -> H2 검색 -> H2 Console 클릭하여 접속



그럼 아래와 같은 접속창이 뜸



아래는 접속 화면이다.







예전에 사용했었는데 까먹어서.. 다시 정리차 블로그 글을 올려봤다.

'Database > DBMS' 카테고리의 다른 글

H2 설정 및 접속 방법  (0) 2019.01.03


객체지향 프로그래밍(OOP)과 절차지향 프로그래밍(POP) 차이



정의(Definition)

OOP는 객체지향 프로그래밍을 의미하며 알고리즘보다는 데이터에 초점을 맞춘 프로그래밍 방식이며, 절차지향적 프로그래밍의 줄임말인 POP은 절차적 추상화(procedural abstractions)에 초점을 맞춘다.


프로그램(Programs)

OOP에서 프로그램은 클래스의 인스턴스(instance)인 객체라고 불리는 작은 청크로 나뉘고, POP에서 주요 프로그램은 기능에 따라 작은 부분으로 나뉜다.


액세싱 모드(Accessing Mode)

OOP에서는 속성(attributes)이나 기능(functions)에 액세스하는데 'Private', 'Public', 'Protected'의 세 가지 액세스 모드가 사용된다. 반면에 POP에서는 특정 프로그램의 속성이나 기능에 접근하기 위해 그러한 접근 모드가 필요하지 않다.


포커스(Focus)

OOP의 경우 프로그램과 관련된 데이터에 초점을 두고 있는 반면, POP는 프로그램의 기능이나 알고리즘에 의존한다.


실행(Excution)

OOP에서 다양한 기능은 동시에 작동할 수 있으며, POP은 방법과 기능을 실행하기 위한 체계적 단계별 접근방식을 따른다.


데이터 제어(Data Control)

OOP에서 객체의 데이터와 기능은 단일 개체처럼 작용하므로 접근성은 동일한 클래스의 구성원 기능으로 제한된다. 반면에 POP에서 데이터는 각 함수에 다른 데이터가 포함되어 있기 때문에 자유롭게 이동할 수 있다.


보안(Security)

OOP는 동일한 등급의 회원 기능으로 데이터 접근을 제한하는 데이터 숨기기 기능 덕분에 POP보다 보안이 강화되었으며, POP에 데이터를 숨기는 방법은 없기 때문에 보안이 취약하다.


수정 용이성(Ease of Modification)

기존 객체에서 새로운 데이터 객체를 쉽게 만들어 객체 지향 프로그램을 쉽게 수정할 수 있지만, POP에서 데이터를 추가하는 과정이 간단하지 않다. 최소한 전체 프로그램을 수정하지 않아도 된다.


프로세스(Process)

OOP는 프로그램 설계를 위한 상향식 접근법(a bottom-up approach)을 따르는 반면, POP는 프로그램 설계를 위해 하향식 접근법(a top-down approach)을 취한다.




OOP vs. POP

Procedure Oriented Programming

Object Oriented Programming

Divided Into
In POP, program is divided into small parts called functions.In OOP, program is divided into parts called objects.
Importance
In POP,Importance is not given to data but to functions as well as sequence of actions to be done.In OOP, Importance is given to the data rather than procedures or functions because it works as a real world.
Approach
POP follows Top Down approach.OOP follows Bottom Up approach.
Access Specifiers
POP does not have any access specifier.OOP has access specifiers named Public, Private, Protected, etc.
Data MovingIn POP, Data can move freely from function to function in the system.In OOP, objects can move and communicate with each other through member functions.
ExpansionTo add new data and function in POP is not so easy.OOP provides an easy way to add new data and function.
Data AccessIn POP, Most function uses Global data for sharing that can be accessed freely from function to function in the system.In OOP, data can not move easily from function to function,it can be kept public or private so we can control the access of data.
Data HidingPOP does not have any proper way for hiding data so it is less secure.OOP provides Data Hiding so provides more security.
Overloading
In POP, Overloading is not possible.In OOP, overloading is possible in the form of Function Overloading and Operator Overloading.
ExamplesExample of POP are : C, VB, FORTRAN, Pascal.Example of OOP are : C++, JAVA, VB.NET, C#.NET.

출처 : http://www.differencebetween.net/technology/difference-between-oop-and-pop/

출처 : https://freefeast.info/general-it-articles/difference-between-procedure-oriented-programming-and-object-oriented-programming-procedure-oriented-programming-vs-object-oriented-programming/




아래는 C와 Java로 만든 프로그램이다. C는 포인터를 사용하고 있으며, Java는 객체를 이용하였다.


C


void main() {   

    int*    x;  // Allocate the pointers x and y

    int*    y;  // (but not the pointees)


    x = malloc(sizeof(int));    // Allocate an int pointee, and set x to point to it


    *x = 42;    // Dereference x to store 42 in its pointee


    *y = 13;    // CRASH -- y does not have a pointee yet


    y = x;      // Pointer assignment sets y to point to x's pointee


    *y = 13;    // Dereference y to store 13 in its (shared) pointee

}

 


Java

class IntObj {

    public int value;

}


public class Binky {

    public static void main(String[] args) {

        IntObj  x;  // Allocate the pointers x and y

        IntObj  y = new IntObj();  // (but not the IntObj pointees)


        x = new IntObj();   // Allocate an IntObj pointee, and set x to point to it


        x.value = 42;   // Dereference x to store 42 in its pointee


        y.value = 13;   // CRASH -- y does not have a pointee yet


        y = x;  // Pointer assignment sets y to point to x's pointee


        y.value = 13;   // Deference y to store 13 in its (shared) pointee

        System.out.println("x  address: "+x + ",  value: "+x.value);

        System.out.println("y  address: "+y + ",  value: "+y.value);

    }


출처 : https://stackoverflow.com/questions/1750106/how-can-i-use-pointers-in-java


Call By Reference라면 상태를 변경하는게 아니라 실제 Call By Value 함수의 y에 다른 IntObj 객체를 넣어 바뀐다면 그게 Call By Reference가 되는 것이다.

이 코드의 결과는 아래와 같다.


 x  address: IntObj@7852e922,  value: 13

 y  address: IntObj@7852e922,  value: 13




좀 더 자세한 예제는 아래의 링크를 참조하였다.

https://www.slideshare.net/QooJuice/vs-60147566



+ Recent posts